/*!
 * \file WtUftStraFact.cpp
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader UFT超高频策略工厂实现文件
 * 
 * \details 该文件实现了WtUftStraFact类的完整功能，提供UFT超高频策略的工厂管理服务：
 *          
 *          核心功能实现：
 *          - C接口导出：支持动态库加载和插件化使用
 *          - 策略创建：根据策略名称创建具体超高频策略实例
 *          - 策略销毁：安全释放策略实例和相关资源
 *          - 策略枚举：列出工厂支持的所有超高频策略类型
 *          - 工厂标识：提供唯一的工厂名称
 *          
 *          支持的策略：
 *          - SimpleUft：简单超高频策略，适合超高频交易应用
 *          - 其他自定义UFT策略（可扩展）
 *          
 *          超高频策略特性：
 *          - 极致性能：微秒级策略实例化和管理
 *          - 内存优化：高效的对象池和无锁数据结构
 *          - 并发安全：SpinMutex等高性能同步原语
 *          - 异常安全：完善的错误处理和资源管理
 *          
 *          技术优化：
 *          - 零拷贝：减少不必要的数据拷贝开销
 *          - 缓存友好：优化内存访问模式提高性能
 *          - NUMA感知：针对多核架构的内存访问优化
 *          - 系统调用最小化：减少内核态切换延迟
 *          
 *          作为超高频交易系统的重要组件，支持策略的动态加载和管理
 */

#include "WtUftStraFact.h"
#include "WtUftStraDemo.h"

#include <string.h>

const char* FACT_NAME = "WtUftStraFact";	/*!< 工厂名称常量 */

/*!
 * \brief C接口导出函数
 * 
 * \details 提供标准C接口，便于动态库加载和插件化使用
 */
extern "C"
{
	/*!
	 * \brief 创建超高频策略工厂实例
	 * \return IUftStrategyFact接口指针
	 * 
	 * \details 创建UFT超高频策略工厂的新实例，用于策略管理：
	 *          - 返回基类接口指针，便于多态使用
	 *          - 调用者负责通过deleteStrategyFact释放资源
	 *          - 支持超高频策略的特殊优化
	 *          
	 *          性能优化考虑：
	 *          - 工厂实例预分配内存池
	 *          - CPU亲和性设置
	 *          - 高精度时钟初始化
	 *          - 网络接口优化配置
	 */
	EXPORT_FLAG IUftStrategyFact* createStrategyFact()
	{
		IUftStrategyFact* fact = new WtUftStraFact();
		return fact;
	}

	/*!
	 * \brief 删除超高频策略工厂实例
	 * \param fact 要删除的工厂实例指针
	 * 
	 * \details 安全删除超高频策略工厂实例并释放相关资源：
	 *          - 检查指针有效性，防止空指针删除
	 *          - 清理工厂管理的所有超高频策略资源
	 *          - 释放预分配的内存池和缓冲区
	 *          - 恢复CPU亲和性和调度优先级设置
	 */
	EXPORT_FLAG void deleteStrategyFact(IUftStrategyFact* fact)
	{
		if (fact != NULL)
			delete fact;
	}
}

/*!
 * \brief 构造函数
 * 
 * \details 初始化超高频策略工厂，设置默认状态：
 *          - 初始化高性能内存分配器
 *          - 配置超低延迟网络参数
 *          - 预分配关键数据结构
 */
WtUftStraFact::WtUftStraFact()
{
}

/*!
 * \brief 析构函数
 * 
 * \details 清理工厂资源，确保所有超高频策略实例被正确释放：
 *          - 停止所有活跃的超高频策略
 *          - 释放内存池和缓冲区
 *          - 清理网络连接和数据订阅
 *          - 恢复系统性能设置
 */
WtUftStraFact::~WtUftStraFact()
{
}

/*!
 * \brief 获取工厂名称
 * \return 工厂名称字符串
 * 
 * \details 返回该工厂的唯一标识名称，用于：
 *          - 区分不同的超高频策略工厂
 *          - 策略实例的归属验证
 *          - 日志记录和性能分析
 *          - 系统监控和错误诊断
 */
const char* WtUftStraFact::getName()
{
	return FACT_NAME;
}

/*!
 * \brief 枚举工厂支持的超高频策略
 * \param cb 枚举回调函数
 * 
 * \details 通过回调函数列出工厂支持的所有超高频策略类型：
 *          - "SimpleUft"：简单超高频策略，展示UFT策略基本框架
 *          
 *          回调参数说明：
 *          - 参数1：工厂名称
 *          - 参数2：策略名称
 *          - 参数3：是否为高级策略（true表示支持高级功能）
 *          
 *          超高频策略特点：
 *          - 微秒级延迟：极致的响应速度
 *          - 高并发：支持大量并发订单处理
 *          - 实时性：毫秒以下的数据处理
 *          - 稳定性：7x24小时连续运行
 */
void WtUftStraFact::enumStrategy(FuncEnumUftStrategyCallback cb)
{
	cb(FACT_NAME, "SimpleUft", true);
}

/*!
 * \brief 创建超高频策略实例
 * \param name 策略名称
 * \param id 策略实例ID
 * \return 创建的策略实例指针，失败返回NULL
 * 
 * \details 根据策略名称创建对应的超高频策略实例：
 *          - "SimpleUft"：创建简单超高频策略实例
 *          - 不支持的策略名称返回NULL
 *          - 每个策略实例具有唯一的ID标识
 *          - 调用者负责通过deleteStrategy释放策略实例
 *          
 *          超高频策略特殊优化：
 *          - 预分配内存：避免运行时内存分配延迟
 *          - CPU绑定：将策略绑定到特定CPU核心
 *          - 优先级提升：提高策略进程调度优先级
 *          - 网络优化：配置超低延迟网络参数
 *          - 缓存预热：预加载关键数据到CPU缓存
 *          
 *          性能监控：
 *          - 延迟统计：实时监控策略响应延迟
 *          - 吞吐量监控：跟踪订单处理能力
 *          - 资源使用：监控CPU和内存使用情况
 *          - 网络质量：监控网络延迟和丢包率
 */
UftStrategy* WtUftStraFact::createStrategy(const char* name, const char* id)
{
	if(strcmp(name, "SimpleUft") == 0)
	{
		return new WtUftStraDemo(id);
	}

	return NULL;
}

/*!
 * \brief 删除超高频策略实例
 * \param stra 要删除的策略实例指针
 * \return 删除成功返回true，失败返回false
 * 
 * \details 安全删除超高频策略实例并释放相关资源：
 *          - 检查策略指针有效性
 *          - 验证策略是否属于本工厂创建
 *          - 停止所有订单和交易活动
 *          - 清理超高频数据流订阅
 *          - 释放实时计算缓存
 *          - 清理无锁队列和缓冲区
 *          - 执行安全删除操作
 *          - 防止删除其他工厂创建的策略实例
 *          
 *          超高频策略特殊处理：
 *          - 确保所有未完成订单被正确处理或撤销
 *          - 停止高频数据订阅避免内存泄漏
 *          - 清理SpinMutex等无锁同步原语
 *          - 释放预分配的内存池和对象池
 *          - 恢复CPU亲和性和调度优先级
 *          - 清理网络连接和套接字资源
 *          
 *          性能统计：
 *          - 记录策略运行时长和交易统计
 *          - 输出延迟分析和性能报告
 *          - 保存异常事件和错误日志
 */
bool WtUftStraFact::deleteStrategy(UftStrategy* stra)
{
	if (stra == NULL)
		return true;

	if (strcmp(stra->getFactName(), FACT_NAME) != 0)
		return false;

	delete stra;
	return true;
}
